/*
消息控制器
*/
var msgQueue = {
	msgQueue:[],
};

// 向队尾添加一个元素
msgQueue.enqueue =function(element) {
    this.msgQueue.push(element);
},

 	
// 删除队首的元素
msgQueue.dequeue = function(){
    return this.msgQueue.shift();
},
    // 读取队首的元素
msgQueue.front=function(){
    return this.msgQueue[0];
},
	// 插入队首
msgQueue.insertFront=function(element){
    this.msgQueue.splice(0,0,element); 
},

    // 读取队尾的元素
msgQueue.back=function(){
    return this.msgQueue[this.msgQueue.length - 1];
 },
    // 显示队列内的所有元素
msgQueue.toString=function(){
    var retStr = "";
     for(var i = 0; i < this.msgQueue.length; ++i) {
     	retStr += this.msgQueue[i] + "\n";
     }
     return retStr;
},
// 判断队列是否为空
msgQueue.empty=function(){
    if(this.msgQueue.length == 0) {
        return true;
    }else {
        return false;
    }
}
var DN_CMD = require("zjhCMD");
require("zjheventConfig");
require("zjhgameConfig");

var SocketOrderConfig = {
	"UserReadyNtf":0.5, //准备
	"EvtGoldFlowerameStart":3.5,
	"GoldFlowerUserLookCardNtf":0, //请求看牌返回
	"GoldFlowerUserChipNtf":1, //请求下注返回
    "GoldFlowerUserCompareNtf":4,//玩家比牌  返回
    "GoldFlowerUserFlodNtf":0.5,//玩家超时弃牌
    "GoldFlowerRoundOverCompareCard":5,//超过最大积分  开始比牌消息
    "FinalGameOver":20, //最终结算
    "GoldFlowerGameOver":5,//结算
    "clearTable":1,
    "BULL_FRIGHT_CLASSIC_EXIT_DESK":0, //退出桌子
};

var SocketImmediateConfig = {
	"UserEnterDeskNtf":0,
    "GetDeskInfoRsp":0,
    "EvtDeskChat":0,
};


var handler2 = function(obj,cmd,func) {
    if(!func || !obj) return null;
    return function(paras) {
        func.call(obj,cmd,paras);
    };
};

var SocketManager = cc.Class({
    extends: cc.Component,

    properties: {
        className: "SocketManager",
    },

    ctor(){
    	console.log("新建socketManager");
	    this.msgQueue = msgQueue ;
	    this.couldDeal = true ;
	    this.initaddEvent();
	    this.schedule(this.dealMsg,0.1);   
        // this.scheduleOnce(function(){
        //     console.log("发送西欧西欧");
        //     this.FinalGameOver();
        // },3)
        
    },
    //初始化游戏监听
    initaddEvent:function(){
    	for(var k in SocketOrderConfig)
    	{	
    		 DataManager.registerMesgObserve(DN_CMD[k],this,handler2(this,k,this.pushOrderMsg));
    	}
    	for(var k in SocketImmediateConfig)
    	{	
    		 DataManager.registerMesgObserve(DN_CMD[k],this,handler2(this,k,this.pushImmediatelyMsg));
    	}
    },

    dealMsg:function(){
    	if(this.couldDeal){
    		if(this.msgQueue.empty() == false){ //有消息要处理
    			var msg = this.msgQueue.dequeue();
    			var time = SocketOrderConfig[msg.cmd]

    			this[msg.cmd](msg.info);
    			console.log("处理"+msg.cmd+"消息");
    			if(time>0){
    				this.couldDeal = false ;
	    			this.subTimerId = function(){	
	    				console.log("time->"+time);	
	    				if(time<=0){
	    					 this.unschedule(this.subTimerId);
	    					 this.subTimerId = null;
	    					 this.couldDeal = true ;
	    				}
	    				time = time - 1;
	    			}
	    			this.schedule(this.subTimerId,0.5);
	    		}
    		}
    	}
    },

    pushOrderMsg:function(cmd,info){
    	console.log("cmd->"+cmd);
    	this.msgQueue.enqueue({cmd:cmd,info:info})
    },

    pushImmediatelyMsg:function(cmd,info){
    	console.log("cmd->"+cmd);
    	dump(info);
    	this[cmd](info);
    },
   
    //玩家进入房间  返回
    UserEnterDeskNtf:function(info){

        console.log("玩家进入房间");
        GameData.updateEnterDeskInfo(info.model);
        EventManager.dispatchEventF(EventConfig.UserEnterDeskNtf,GameData);
    },

    //玩家准备回调
    UserReadyNtf:function(info){
        console.log("收到玩家准备信息");
        dump(info)    
        EventManager.dispatchEventF(EventConfig.UserReadyNtf,info.model);
    },
    /*
    message EvtBullFrightClassicGameStart {
    optional int32 deskid =1; // deskid
    repeated GameUserInfo users = 2;
    optional DeskPlayInfo play_info = 3;
    optional int32 roomid = 4;      
    optional int32 status= 5;           // 牌桌状态
    optional int32 grab_time = 6;       // 抢庄时间
    repeated int32 grab_score = 7;      // 加倍倍数列表
    repeated int32 card = 8;            //用户手牌
    }
    通知开始游戏
    */
    /*
gameController.js:366 收到开始游戏信息
 :25 -------------------dump start------------------
 :38 {
 :53 　　cmd: 1601
 :53 　　ret: 0
 :53 　　sn: 0
 :44 　　model: 
 :38 　　{
 :53 　　　　deskid: 100122
 :44 　　　　users: 
 :38 　　　　{
 :44 　　　　　　0: 
 :38 　　　　　　{
 :53 　　　　　　　　status: 1081
 :53 　　　　　　　　gold: 4900
 :53 　　　　　　　　chips: 0
 :53 　　　　　　　　uin: 824
 :53 　　　　　　　　nick: 婉约开阔的小蔷
 :53 　　　　　　　　seatid: 1
 :53 　　　　　　　　sex: 1
 :53 　　　　　　　　round_chips: 0
 :53 　　　　　　　　beauty: false
 :53 　　　　　　　　b_rank: 0
 :53 　　　　　　　　decoration: -1
 :53 　　　　　　　　vip_days: 0
 :53 　　　　　　　　hiding: 0
 :53 　　　　　　　　portrait: IMG2
 :53 　　　　　　　　is_master: 0
 :56 　　　　　　}
 :44 　　　　　　1: 
 :38 　　　　　　{
 :53 　　　　　　　　status: 1081
 :53 　　　　　　　　gold: 4900
 :53 　　　　　　　　chips: 0
 :53 　　　　　　　　uin: 822
 :53 　　　　　　　　nick: 光秃秃的小萌
 :53 　　　　　　　　seatid: 4
 :53 　　　　　　　　sex: 1
 :53 　　　　　　　　round_chips: 0
 :53 　　　　　　　　beauty: false
 :53 　　　　　　　　b_rank: 0
 :53 　　　　　　　　decoration: -1
 :53 　　　　　　　　vip_days: 0
 :53 　　　　　　　　hiding: 0
 :53 　　　　　　　　portrait: IMG6
 :53 　　　　　　　　is_master: 0
 :56 　　　　　　}
 :56 　　　　}
 :44 　　　　play_info: 
 :38 　　　　{
 :53 　　　　　　min_bet: 25
 :53 　　　　　　max_bet: 0
 :53 　　　　　　dft_improve_bet: 0
 :53 　　　　　　chips: 0
 :53 　　　　　　round_chips: 0
 :56 　　　　}
 :53 　　　　status: 2
 :53 　　　　grab_time: 1
 :44 　　　　grab_score: 
 :38 　　　　{
 :53 　　　　　　0: 1
 :53 　　　　　　1: 2
 :53 　　　　　　2: 3
 :53 　　　　　　3: 4
 :56 　　　　}
 :44 　　　　card: 
 :38 　　　　{
 :53 　　　　　　0: 8
 :53 　　　　　　1: 37
 :53 　　　　　　2: 50
 :53 　　　　　　3: 54
 :56 　　　　}
    optional int32 current_play_count = 9;      //游戏当前轮数
    optional int32 total_play_count = 10;       //游戏当前总轮数
    play_type //游戏模式

 :56 　　}
 :56 }

 // 炸金花游戏开始  cmd 1701
message EvtGoldFlowerameStart {
    optional int32 deskid =1; // deskid
    optional int32 dealer =2; // dealer id
    optional int32 next_uin =3; // next_uin
    repeated GameUserInfo users = 4;
    optional DeskPlayInfo play_info =5;

    optional int32 roomid = 6;
    optional int64 total_chips = 7;         // 传一下total chips
    optional int32 status=8;                // 牌桌状态
    optional int32 dealer_seatid=9;        // dealer的座位号

    optional int32 round_count = 10;        // 当前轮数
    optional int32 max_round = 11;          // 最大轮数
    optional int32 can_operator = 12;       // 可以执行的操作 包括 看牌 比牌 用位数表示  11  第一位看牌  第二位比牌 1是可以 0是不可以
    repeated int32 chip_list = 13;          // 可加注列表
    optional int32 first_uin = 14; // 先手玩家
    optional int32 current_play_count = 15; //当前是第几局
    optional int32 total_play_count = 16;   //总共多少局
    
}
    */

    EvtGoldFlowerameStart:function(info){    
        EventManager.dispatchEventF(EventConfig.stopTimer);
        console.log("收到开始游戏信息");
        dump(info);
        GameData.updateGameStartInfo(info.model);
        EventManager.dispatchEventF(EventConfig.startGame,info.model);

    },


    /*
    看牌返回
    // cmd 1703  用户请求看牌回应
    message GoldFlowerUserLookCardNtf{
        optional int32 uin = 1;         //用户ID
        optional int32 desk_id=2;       //桌子ID
        repeated int32 card = 3;        //用户手牌
        optional int32 card_type = 4;   //手牌类型
        optional int32 can_operator = 5;// 可以执行的操作 包括 看牌 比牌 弃牌  用位数表示  111  第一位看牌  第二位比牌 第三位弃牌   新加一位  第五位是代表目前是火拼状态
    }
    */
    GoldFlowerUserLookCardNtf:function(info){
        console.log("收到看牌信息");
        dump(info);
        GameData.updatePlayerInfo(info.model);
        EventManager.dispatchEventF(EventConfig.kanPaiNtf,info.model);
    },
    /*
    // cmd: 1705  广播：用户加注
    message GoldFlowerUserChipNtf{
        optional int32 uin = 1;             //用户ID
        optional int32 desk_id=2;           //桌子ID
        optional int64 call_money=3;        //用户下注的钱
        optional int32 round_count=4;       //当前轮数
        optional int32 max_count=5;         //最大轮数
        optional int64 user_money=6;        //用户当前下的钱
        optional int64 desk_total_chip=7;   //桌子当前总注数
        optional int32 next_uin=8;          //下一个操作的玩家  如果为-1 表示当局已经结束 等待game_over指令
        optional int32 can_operator = 9;        // 可以执行的操作 包括 看牌 比牌 弃牌  用位数表示  11  第一位看牌  第二位比牌
    }
    */
    GoldFlowerUserChipNtf:function(info){
        console.log("收到下注信息");
        dump(info);
        EventManager.dispatchEventF(EventConfig.xiaZhu,info.model);
    },

    /*
    // cmd:1714 游戏结束
    message GoldFlowerGameOver{
        optional int32 winner = 1;              // 赢的用户ID
        message GameOverResultInfo{
            optional int32 uin = 1;
            optional int64 win_money = 2;           //输赢的钱  
            optional int32 showcard = 3;            //是否需要秀牌
            repeated int32 card = 4;                //用户手牌
            optional int32 card_type = 5;           //手牌类型
            optional int64 user_money= 6;           //用户剩余的钱
        }
        repeated GameOverResultInfo result = 2;
        optional int32 dealer_seatid = 3;                  // 下一轮的庄家座位
        optional int32 start_time = 4;                     // 下一轮开始等待的时间
        optional int32 show_card_time = 5;                 // 赢家亮牌的时间
    }

    -------------------dump start------------------
 38 {
 53 　　cmd: 1714
 53 　　ret: 0
 53 　　sn: 0
 44 　　model: 
 38 　　{
 53 　　　　winner: 3614
 44 　　　　result: 
 38 　　　　{
 44 　　　　　　0: 
 38 　　　　　　{
 53 　　　　　　　　uin: 3614
 53 　　　　　　　　win_money: 4
 53 　　　　　　　　showcard: 0
 44 　　　　　　　　card: 
 38 　　　　　　　　{
 53 　　　　　　　　　　0: 32
 53 　　　　　　　　　　1: 24
 53 　　　　　　　　　　2: 53
 56 　　　　　　　　}
 53 　　　　　　　　card_type: 0
 53 　　　　　　　　user_money: 8
 56 　　　　　　}
 44 　　　　　　1: 
 38 　　　　　　{
 53 　　　　　　　　uin: 3615
 53 　　　　　　　　win_money: -4
 53 　　　　　　　　showcard: 0
 44 　　　　　　　　card: 
 38 　　　　　　　　{
 53 　　　　　　　　　　0: 37
 53 　　　　　　　　　　1: 41
 53 　　　　　　　　　　2: 26
 56 　　　　　　　　}
 53 　　　　　　　　card_type: 0
 53 　　　　　　　　user_money: -4
 56 　　　　　　}
 56 　　　　}
 53 　　　　dealer_seatid: 3
 53 　　　　start_time: 8
 53 　　　　show_card_time: 5
 56 　　}
 56 }
    */
    GoldFlowerGameOver:function(info){
        console.log("收到结算信息");
        dump(info);
        GameData.updateGameEndInfo(info.model)
        GameData.start_time = info.model.start_time ;
        EventManager.dispatchEventF(EventConfig.gameoverNtf,info.model);
        this.msgQueue.insertFront({cmd:"clearTable",info:info});
        
    },

    clearTable:function(info){
        EventManager.dispatchEventF(EventConfig.clearTable,info.model);
    },
    /*
    //cmd：1707 广播：用户比牌      
    message GoldFlowerUserCompareNtf{
        optional int32 uin = 1;                 //用户ID
        optional int32 desk_id=2;               //桌子ID
        optional int32 compare_uin=3;           //需要比牌玩家的uin
        optional int32 result=4;                //结果 1是发起比牌的人赢  0是发起比牌的人输
        optional int32 round_count=5;           //当前轮数
        optional int32 max_count=6;             //最大轮数
        optional int64 user_money=7;            //用户当前下的钱
        optional int64 desk_total_chip=8;       //桌子当前总注数
        optional int64 user_pay_real_money=9;   //用户实际出了多少钱(有可能是用户没钱了 强制比牌)
        optional int32 next_uin=10;             //下一个玩家(如果下一个玩家是自己，表示比牌玩家没钱了，需要一直比下去  为-1表示游戏结束)
        optional int32 can_operator = 11;       // 可以执行的操作 包括 看牌 比牌 弃牌  用位数表示  11  第一位看牌  第二位比牌 
        repeated int32 card = 12;               //用户手牌
        optional int32 card_type = 13;          //手牌类型
    }
    */
    GoldFlowerUserCompareNtf:function(info){
        console.log("收到比牌返回");
        dump(info);
        EventManager.dispatchEventF(EventConfig.compareNtf,info.model);
    },
    /*
    // cmd:1711 广播：用户弃牌
    message GoldFlowerUserFlodNtf{
        optional int32 uin = 1;                 //用户ID
        optional int32 desk_id=2;               //桌子ID
        optional int32 round_count=3;           //当前轮数
        optional int32 max_count=4;             //最大轮数
        optional int64 user_money=5;            //用户当前下的钱
        optional int64 desk_total_chip=6;       //桌子当前总注数
        optional int32 next_uin=7;              //下一个操作的玩家  如果为-1 表示当局已经结束 等待game_over指令
        optional int32 can_operator = 8;        // 可以执行的操作 包括 看牌 比牌 弃牌  用位数表示  111  第一位看牌  第二位比牌 第三位弃牌  新加一位  第五位是代表目前是火拼状态
        repeated int32 card = 9;                //弃牌用户手牌
        optional int32 card_type = 10;          //弃牌手牌类型
    }
    */
    GoldFlowerUserFlodNtf:function(info){
        console.log("收到玩家弃牌");
        dump(info);
        GameData.updatePlayerInfo(info.model);
        EventManager.dispatchEventF(EventConfig.qiPai,info.model);
    },
    /*
    // cmd:1709 轮数结束  玩家比牌
    message GoldFlowerRoundOverCompareCard{
        repeated int32 userlist = 1;        //比牌的两个玩家
        optional int32 win_uin = 2;             //赢的玩家的id
        repeated int32 card = 3;                //输家手牌
        optional int32 card_type = 4;           //输家手牌类型
    }
    */
    GoldFlowerRoundOverCompareCard:function(info){
        console.log("游戏统一比牌");
        dump(info);
        EventManager.dispatchEventF(EventConfig.roundOverCompareCard,info.model);
    },











    /*
    // 最终结算 1666
        message FinalGameOver{
            optional int32 desk_id = 1;     //桌子ID 
            optional int32 stop_time = 2;   //结束时间
            optional string bank_name = 3;  //房主昵称
            optional int32 play_count = 4;  //总的局数
            
            message user_info       //结算玩家信息
            {
                optional int32 uin = 1;         //用户ID
                optional string nick = 2;       //用户昵称
                optional int32 score = 3;       //用户分数
                optional int32 flag = 4;        //用户标识  1.大赢家 
            }
            repeated user_info users = 5;
        }

    var temp = {
    　　cmd: 1666,
     　　ret: 0,
     　　sn: 0,
     　　model: 
     　　{
     　　　　desk_id: 100074,
     　　　　stop_time: 1525601442,
    　　　　bank_name: "迷人的凡凡",
     　　　　users: 
    　　　　{
     　　　　　　0: 
     　　　　　　{
     　　　　　　　　"uin": 1493,
     　　　　　　　　"nick": "迷人的凡凡",
     　　　　　　　　"score": 15,
     　　　　　　　　"flag": 1,
     　　　　　　},
    　　　　},
     　　},
     };
 }
    */
    FinalGameOver:function(info){ 
      EventManager.dispatchEventF(EventConfig.ShowFinalGameOver,temp);
    },
    /*

    // 用户退出
    message EvtUserExit {
        optional int32 deskid =1; //desk id
        optional int32 dealer =2; // dealer id
        message ExitOpInfo {
            optional int32 uin=1;
            optional int64 gold=2;
            optional int64 chips=3;
            optional int64 round_chips=4;
            optional int64 bet_chips=5;
            optional int32 status=6;
            optional bool auto_play = 7;                        // 是否是托管状态
        }
        optional ExitOpInfo op_user =3;
        optional int32 next_uin =4;
        optional int64 total_chips =5;                          // 因为用户弃牌会导致底注增加，站起也是这样
        repeated TotalChipsDetailInfo total_chips_detail =6;
        optional DeskPlayInfo play_info=7;
        optional int64 player_op_past_time=8;
        optional int32 roomid =9;
        optional int32 dealer_seatid=10;                        // dealer的座位号
        message JH {
            optional Operations ops = 1;                        // 可执行的操作
        }
        optional JH jh = 11;                                    // 金花专用的字段
        optional int32 reason = 12;                             // 退桌原因
        optional bytes fingerprint = 13;                        // 校验用
        optional int32 first_uin = 14;                          // 先手玩家
    }
    */
    //玩家退出
    BULL_FRIGHT_CLASSIC_EXIT_DESK:function(info){ 
        EventManager.dispatchEventF(EventConfig.UserExit,info);
    },
  
    removeEvent:function(){
        for(var k in SocketOrderConfig)
    	{	
    		 DataManager.removeMesgObserve(DN_CMD[k],this);
    	}
    	for(var k in SocketImmediateConfig)
    	{	
    		 DataManager.removeMesgObserve(DN_CMD[k],this);
    	}
    },
    onDestroy:function(){
        console.log("销毁socketMgr");
       this.unschedule(this.dealMsg);
	   this.dealMsg = null;
       this.removeEvent();
     },
     //获取桌子信息
     GetDeskInfoRsp:function(info){
        console.log("收到桌子信息");
        dump(info);
        EventManager.dispatchEventF(EventConfig.showRoomInfo,info.model); 
     },

     //收到消息
     EvtDeskChat:function(info){
        console.log("收到消息");
        dump(info);
        EventManager.dispatchEventF(EventConfig.EvtDeskChat,info.model);    
     },
});

module.exports = SocketManager;